package ${packagePrefix}.${domainObjectName?lower_case}.infrastructure.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

<#if generateComments>
/**
 * ${domainObjectName}Excel导入读监听器
 * <p>
 * 用于批量处理Excel导入数据
 * </p>
 *
 * @author Auto Generated
 */
</#if>
@Slf4j
public class ${domainObjectName}ExcelReadListener<T> implements ReadListener<T> {

    <#if generateComments>/**
     * 数据列表，用于缓存待处理的数据
     */
    </#if>
    private final List<T> dataList = new ArrayList<>();

    <#if generateComments>/**
     * 数据处理器，接收一批数据进行处理
     */
    </#if>
    private final Consumer<List<T>> batchProcessor;

    <#if generateComments>/**
     * 批处理大小
     */
    </#if>
    private final int batchSize;

    <#if generateComments>/**
     * 构造函数，初始化数据处理器和批处理大小
     *
     * @param batchProcessor 批处理处理器
     * @param batchSize      批处理大小
     */
    </#if>
    public ${domainObjectName}ExcelReadListener(Consumer<List<T>> batchProcessor, int batchSize) {
        this.batchProcessor = batchProcessor;
        this.batchSize = batchSize;
    }

    <#if generateComments>
    /**
     * 每解析一行数据都会调用此方法
     *
     * @param data    解析出的数据对象
     * @param context Excel解析上下文
     */
    </#if>
    @Override
    public void invoke(T data, AnalysisContext context) {
        log.debug("解析Excel数据: {}", data);
        dataList.add(data);
        
        // 当数据达到批处理大小时，进行一次批处理
        if (dataList.size() >= batchSize) {
            processData();
        }
    }

    <#if generateComments>
    /**
     * 所有数据解析完成后调用此方法
     *
     * @param context Excel解析上下文
     */
    </#if>
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 确保最后一批数据也被处理
        if (!CollectionUtils.isEmpty(dataList)) {
            processData();
        }
        log.info("Excel数据解析完成");
    }

    <#if generateComments>
    /**
     * 批量处理数据
     */
    </#if>
    private void processData() {
        log.info("开始批量处理Excel数据，数量: {}", dataList.size());
        batchProcessor.accept(new ArrayList<>(dataList));
        // 清空缓存的数据
        dataList.clear();
    }
} 